Below are the keys to interpreting the different parameter ‘levels’ of each Scenario. We have a total of 12,500 unique Scenarios
Vital Rates, K Selected
| age |
birthRate |
survivalRate |
N0_proportion |
| 0 |
0.00 |
0.70 |
0.5181199 |
| 1 |
1.40 |
0.95 |
0.2403399 |
| 2 |
1.90 |
0.90 |
0.1513028 |
| 3 |
1.75 |
0.00 |
0.0902375 |
Vital Rates, R Selected
| age |
birthRate |
survivalRate |
N0_proportion |
| 0 |
0 |
0.14 |
0.9041858 |
| 1 |
14 |
0.18 |
0.0842448 |
| 2 |
16 |
0.22 |
0.0100919 |
| 3 |
12 |
0.00 |
0.0014776 |
Boldness rbeta Shape Parameters
| Parameter |
Shape |
skewLow |
skewMedLow |
uniform |
skewMedHigh |
skewHigh |
| Boldness |
rbeta: Shape1 |
1 |
2 |
1 |
5 |
5 |
| Boldness |
rbeta: Shape2 |
5 |
5 |
1 |
2 |
1 |
Poisson Lambda, Information Transfer, and Naive Learning
| Parameter |
Low |
MedLow |
Med |
MedHigh |
High |
| rpois: Lambda |
0.000 |
1.000 |
2.00 |
3.0 |
4.0 |
| probability: InfoTransfer |
0.005 |
0.010 |
0.05 |
0.1 |
0.5 |
| probability: InfoDeath |
0.010 |
0.100 |
0.20 |
0.4 |
0.6 |
| rbinom: naiveLearn |
0.000 |
0.005 |
0.01 |
0.1 |
0.5 |
Vertical Transmission
| Parameter |
True |
False |
| Vertical Transmission |
TRUE |
FALSE |
Boxplots on the general effects of each parameter
The x-axis labels follow this pattern: ‘Vitals - End Result - Parameter Level - Mean Parameter Value (for survived and extirpated results)’. This is across all scenarios, with each scenario having 50 iterations. So these data are grouped to a certain extent to provide you with general patterns.







Attempt to try and quantify the results of the above plots
By taking the same data the the Box Plots are based off of, I fit individual linear models (ANOVA) to each dataset, in the for of MeanYears ~ Scenario. I then captured the Estimates for each Scenario into a table and each column is the model parameter estimate for the scenario given that parameter. This was the first method that popped into my head to try and compare effect sizes between different IBM parameters. I then performed a complete Pairwise Contrast between all scenarios within a parameter model. The scatter plots below are some graphical representations of the covariation between two IBM parameters in Effect-size Space. I hope this makes sense and is somewhat useful. All parameters seems to covary positively with the others, but there are some patterns when you look across the K vs R selected space and whether the model populations survived or were extirpated. The plots are dynamic, so you can turn on/off each point by double-clicking in the legend and hover allows you to see values.
Here are the actual tables of the Effect Sizes for the linear models
This table represent the Effect size of each Scenario on MeanYears to reach K or Crash. I did not calculate any differences between effect sizes, but you could do so if you feel it would be informative.
This table represent the Effect size Pairwise comparisons of each Scenario on MeanYears to reach K or Crash. This is the table used for the above Scatterplots. FYI: For this to work, I renamed the Bold categories to be Low - High, so I removed the prefix ‘skew’, and I also renamed ‘uniform’ to = ‘Med’. Just to allow for easier data joining.
LS0tDQp0aXRsZTogIktub3dsZWRnZSBJQk0gVHVuaW5nIFN0YXRpc3RpY3MiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KPHN0eWxlPg0KICAubXlUYWJsZSB0ZCB7DQogICAgcGFkZGluZzogNDBweDsNCiAgfQ0KPC9zdHlsZT4NCg0KYGBge3IgZWNobz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCnJlcXVpcmUoUlNRTGl0ZSkNCnJlcXVpcmUoanNvbmxpdGUpDQpyZXF1aXJlKHRpZHl2ZXJzZSkNCnJlcXVpcmUoa2FibGVFeHRyYSkNCnJlcXVpcmUoZW1tZWFucykNCnJlcXVpcmUocGxvdGx5KQ0KIyBDb25uZWN0IHRvIHRoZSBkYXRhYmFzZQ0KYm94X2ZsZHIgPC0gIkU6L0JveCBTeW5jL0tub3dsZWRnZUlCTV9yZXN1bHRzIg0KDQojIENyZWF0ZS9Db25uZWN0IHRvIFNRTGl0ZSBEQiBmb3Igc3RvcmFnZSBvZiBtb2RlbCBydW5zDQpkYkNvbm4gPC0gZGJDb25uZWN0KFNRTGl0ZSgpLCBwYXN0ZTAoYm94X2ZsZHIsICIvS25vd2xlZGdlSUJNX01vZGVsVHVuaW5nXzIwMjAxMjE1LnNxbGl0ZSIpKQ0KDQojIEdldCB0aGUgcGFyYW1ldGVyIHJhbmdlcw0Kc2NlbjwtIGRiU2VuZFF1ZXJ5KGRiQ29ubiwgIlNFTEVDVCAqIEZST00gdGJsTW9kZWxTY2VuYXJpb3MiKSAlPiUgDQogIGRiRmV0Y2goKQ0KDQpkSyA8LSBkYXRhLmZyYW1lKGFnZT1jKDAsMSwyLDMpLA0KICAgICAgICAgICAgICAgIGJpcnRoUmF0ZT1jKDAsMS40LDEuOSwxLjc1KSwNCiAgICAgICAgICAgICAgICBzdXJ2aXZhbFJhdGU9YygwLjcsMC45NSwwLjksMCkpDQpLIDwtIGRlbW9nUjo6b2RpYWcoZEskc3Vydml2YWxSYXRlWzE6KG5yb3coZEspLTEpXSwtMSkgIyBQeCwgc3Vydml2YWwgcmF0ZXMgKG5vdGUsIHRoZSBzdXJ2aXZhbCByYXRlIGluIGZpbmFsIGFnZSBjbGFzcyBpcyAwIGF1dG9tYXRpY2FsbHkpDQpLWzEsXSA8LSBkSyRiaXJ0aFJhdGUgIyBGZXJ0aWxpdHkNCnN0YmxfYWdlIDwtIGRlbW9nUjo6ZWlnZW4uYW5hbHlzaXMoSykkc3RhYmxlLmFnZQ0KZEskTjBfcHJvcG9ydGlvbiA8LSBjKDAsc3RibF9hZ2VbMjpsZW5ndGgoc3RibF9hZ2UpXSkNCmRLJE4wX3Byb3BvcnRpb24gPC0gc3RibF9hZ2UNCiMgZEskTjBfcHJvYl9rbm93aW5nIDwtIGMoMC4wNSwgMC4wNSwgMC4wNSwgMC4wNSkNCg0KIyBSIHNlbGVjdGVkIGV4YW1wbGUNCmRSIDwtIGRhdGEuZnJhbWUoYWdlPWMoMCwxLDIsMyksDQogICAgICAgICAgICAgICAgYmlydGhSYXRlPWMoMCwxNCwxNiwxMiksDQogICAgICAgICAgICAgICAgc3Vydml2YWxSYXRlPWMoMC4xNCwwLjE4LDAuMjIsMCkpDQpLIDwtIGRlbW9nUjo6b2RpYWcoZFIkc3Vydml2YWxSYXRlWzE6KG5yb3coZFIpLTEpXSwtMSkgIyBQeCwgc3Vydml2YWwgcmF0ZXMgKG5vdGUsIHRoZSBzdXJ2aXZhbCByYXRlIGluIGZpbmFsIGFnZSBjbGFzcyBpcyAwIGF1dG9tYXRpY2FsbHkpDQpLWzEsXSA8LSBkUiRiaXJ0aFJhdGUgIyBGZXJ0aWxpdHkNCnN0YmxfYWdlIDwtIGRlbW9nUjo6ZWlnZW4uYW5hbHlzaXMoSykkc3RhYmxlLmFnZQ0KZFIkTjBfcHJvcG9ydGlvbiA8LSBjKDAsc3RibF9hZ2VbMjpsZW5ndGgoc3RibF9hZ2UpXSkNCmRSJE4wX3Byb3BvcnRpb24gPC0gc3RibF9hZ2UNCiMgZFIkTjBfcHJvYl9rbm93aW5nIDwtIGMoMC4wNSwgMC4wNSwgMC4wNSwgMC4wNSkNCg0KDQojIFBhcmFtZXRlcnMgdG8gYWRqdXN0IGZvciBzZW5zaXRpdml0eSBhbmFseXNpcw0KI3NleFJhdGlvIDwtIGMoMC40LCAwLjUsIDAuNikNCg0KZCA8LSBsaXN0KEtzZWxlY3RlZCA9IGRLLA0KICAgICAgICAgIFJzZWxlY3RlZCA9IGRSKQ0KDQpib2xkRGlzdCA8LSBkYXRhLmZyYW1lKFBhcmFtZXRlciA9ICJCb2xkbmVzcyIsDQogICAgICAgICAgICAgICAgICAgICAgIFNoYXBlID0gYygicmJldGE6IFNoYXBlMSIsICJyYmV0YTogU2hhcGUyIiksDQogICAgICAgICAgICAgICAgICAgICAgIHNrZXdMb3cgPSBjKDEsIDUpLA0KICAgICAgICAgICAgICAgICAgICAgICBza2V3TWVkTG93ID0gYygyLCA1KSwNCiAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybSA9IGMoMSwgMSksDQogICAgICAgICAgICAgICAgICAgICAgIHNrZXdNZWRIaWdoID0gYyg1LCAyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgc2tld0hpZ2ggPSBjKDUsIDEpKQ0KDQpwb2lzTGFtYmRhIDwtIGRhdGEuZnJhbWUoUGFyYW1ldGVyID0gInJwb2lzOiBMYW1iZGEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBMb3cgPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgIE1lZExvdyA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgTWVkID0gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBNZWRIaWdoID0gMywNCiAgICAgICAgICAgICAgICAgICAgICAgICBIaWdoID0gNCkNCg0KaW5mb3RyYW5zZmVyIDwtIGRhdGEuZnJhbWUoUGFyYW1ldGVyID0gInByb2JhYmlsaXR5OiBJbmZvVHJhbnNmZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgTG93ID0gMC4wMDUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkTG93ID0gMC4wMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZCA9IDAuMDUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkSGlnaCA9IDAuMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBIaWdoID0gMC41KQ0KDQppbmZvRGVhdGggPC0gZGF0YS5mcmFtZShQYXJhbWV0ZXIgPSAicHJvYmFiaWxpdHk6IEluZm9EZWF0aCIsDQogICAgICAgICAgICAgICAgICAgICAgICBMb3cgPSAwLjAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgTWVkTG93ID0gMC4xLA0KICAgICAgICAgICAgICAgICAgICAgICAgTWVkID0gMC4yLA0KICAgICAgICAgICAgICAgICAgICAgICAgTWVkSGlnaCA9IDAuNCwNCiAgICAgICAgICAgICAgICAgICAgICAgIEhpZ2ggPSAwLjYpDQoNCm5haXZlTGVhcm4gPC0gZGF0YS5mcmFtZShQYXJhbWV0ZXIgPSAicmJpbm9tOiBuYWl2ZUxlYXJuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBMb3cgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBNZWRMb3cgPSAwLjAwNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBNZWQgPSAwLjAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgIE1lZEhpZ2ggPSAwLjEsDQogICAgICAgICAgICAgICAgICAgICAgICAgSGlnaCA9IDAuNSkNCg0KdmVydFRyYW5zbWlzc2lvbiA8LSBkYXRhLmZyYW1lKFBhcmFtZXRlciA9ICJWZXJ0aWNhbCBUcmFuc21pc3Npb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlID0gRkFMU0UpDQoNCnBhcmFtczwtIHJiaW5kKHBvaXNMYW1iZGEsIGluZm90cmFuc2ZlciwgaW5mb0RlYXRoLCBuYWl2ZUxlYXJuKQ0KDQpkYXQ8LSBkYlNlbmRRdWVyeShkYkNvbm4sICJTRUxFQ1QgKiBGUk9NIHRibE1vZGVsU3RhdHMiKSAlPiUgDQogIGRiRmV0Y2goKQ0KDQojIFN1bW1hcml6ZSB0aGUgZGF0YSBieSBzY2VuYXJpbw0Kc3VtRGF0PC0gZGF0ICU+JSANCiAgZmlsdGVyKHlyICE9IDApICU+JSANCiAgZ3JvdXBfYnkoU2NlbmFyaW8sIHlyKSAlPiUgDQogIHN1bW1hcmlzZShwb3Auc2l6ZV9NZWFuID0gbWVhbihwb3Auc2l6ZSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIHBvcC5zaXplX1NEID0gc2QocG9wLnNpemUsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBwb3Auc2l6ZV9RMDMgPSBxdWFudGlsZShwb3Auc2l6ZSwgcHJvYnMgPSAwLjAzLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgcG9wLnNpemVfUTk3ID0gcXVhbnRpbGUocG9wLnNpemUsIHByb2JzID0gMC45NywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIGJpcnRoc19NZWFuID0gbWVhbihiaXJ0aHMsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBiaXJ0aHNfU0QgPSBzZChiaXJ0aHMsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBiaXJ0aHNfUTAzID0gcXVhbnRpbGUoYmlydGhzLCBwcm9icyA9IDAuMDMsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBiaXJ0aHNfUTk3ID0gcXVhbnRpbGUoYmlydGhzLCBwcm9icyA9IDAuOTcsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBkZWF0aHNfTWVhbiA9IG1lYW4oZGVhdGhzLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgZGVhdGhzX1NEID0gc2QoZGVhdGhzLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgZGVhdGhzX1EwMyA9IHF1YW50aWxlKGRlYXRocywgcHJvYnMgPSAwLjAzLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgZGVhdGhzX1E5NyA9IHF1YW50aWxlKGRlYXRocywgcHJvYnMgPSAwLjk3LCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgZnJhYy5pbmZvcm1lZF9NZWFuID0gbWVhbihmcmFjLmluZm9ybWVkLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgZnJhYy5pbmZvcm1lZF9TRCA9IHNkKGZyYWMuaW5mb3JtZWQsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBmcmFjLmluZm9ybWVkX1EwMyA9IHF1YW50aWxlKGZyYWMuaW5mb3JtZWQsIHByb2JzID0gMC4wMywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIGZyYWMuaW5mb3JtZWRfUTk3ID0gcXVhbnRpbGUoZnJhYy5pbmZvcm1lZCwgcHJvYnMgPSAwLjk3LCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgbnVtLnNvY2lhbExlYXJuX01lYW4gPSBtZWFuKG51bS5zb2NpYWxMZWFybiwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIG51bS5zb2NpYWxMZWFybl9TRCA9IHNkKG51bS5zb2NpYWxMZWFybiwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIG51bS5zb2NpYWxMZWFybl9RMDMgPSBxdWFudGlsZShudW0uc29jaWFsTGVhcm4sIHByb2JzID0gMC4wMywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIG51bS5zb2NpYWxMZWFybl9ROTcgPSBxdWFudGlsZShudW0uc29jaWFsTGVhcm4sIHByb2JzID0gMC45NywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIG51bS5hc29jaWFsTGVhcm5fTWVhbiA9IG1lYW4obnVtLmFzb2NpYWxMZWFybiwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIG51bS5hc29jaWFsTGVhcm5fU0QgPSBzZChudW0uYXNvY2lhbExlYXJuLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgbnVtLmFzb2NpYWxMZWFybl9RMDMgPSBxdWFudGlsZShudW0uYXNvY2lhbExlYXJuLCBwcm9icyA9IDAuMDMsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBudW0uYXNvY2lhbExlYXJuX1E5NyA9IHF1YW50aWxlKG51bS5hc29jaWFsTGVhcm4sIHByb2JzID0gMC45NywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIHRvdGFsLm51bS5pbnRlcmFjdGlvbnNfTWVhbiA9IG1lYW4odG90YWwubnVtLmludGVyYWN0aW9ucywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIHRvdGFsLm51bS5pbnRlcmFjdGlvbnNfU0QgPSBzZCh0b3RhbC5udW0uaW50ZXJhY3Rpb25zLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgdG90YWwubnVtLmludGVyYWN0aW9uc19RMDMgPSBxdWFudGlsZSh0b3RhbC5udW0uaW50ZXJhY3Rpb25zLCBwcm9icyA9IDAuMDMsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICB0b3RhbC5udW0uaW50ZXJhY3Rpb25zX1E5NyA9IHF1YW50aWxlKHRvdGFsLm51bS5pbnRlcmFjdGlvbnMsIHByb2JzID0gMC45NywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIG1lZC5hZ2VfTWVhbiA9IG1lYW4obWVkLmFnZSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIG1lZC5hZ2VfU0QgPSBzZChtZWQuYWdlLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgbWVkLmFnZV9RMDMgPSBxdWFudGlsZShtZWQuYWdlLCBwcm9icyA9IDAuMDMsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBtZWQuYWdlX1E5NyA9IHF1YW50aWxlKG1lZC5hZ2UsIHByb2JzID0gMC45NywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIENvdW50ID0gbigpDQogICAgICAgICAgICApICU+JSANCiAgbXV0YXRlKHBvcC5zaXplX0NJID0gKHBvcC5zaXplX1NEIC8gc3FydChDb3VudCkpICogMS45NiwNCiAgICAgICAgIGJpcnRoc19DSSA9IChiaXJ0aHNfU0QgLyBzcXJ0KENvdW50KSkgKiAxLjk2LA0KICAgICAgICAgZGVhdGhzX0NJID0gKGRlYXRoc19TRCAvIHNxcnQoQ291bnQpKSAqIDEuOTYsDQogICAgICAgICBmcmFjLmluZm9ybWVkX0NJID0gKGZyYWMuaW5mb3JtZWRfU0QgLyBzcXJ0KENvdW50KSkgKiAxLjk2LA0KICAgICAgICAgbnVtLnNvY2lhbExlYXJuX0NJID0gKG51bS5zb2NpYWxMZWFybl9TRCAvIHNxcnQoQ291bnQpKSAqIDEuOTYsDQogICAgICAgICBudW0uYXNvY2lhbExlYXJuX0NJID0gKG51bS5hc29jaWFsTGVhcm5fU0QgLyBzcXJ0KENvdW50KSkgKiAxLjk2LA0KICAgICAgICAgdG90YWwubnVtLmludGVyYWN0aW9uc19DSSA9ICh0b3RhbC5udW0uaW50ZXJhY3Rpb25zX1NEIC8gc3FydChDb3VudCkpICogMS45NiwNCiAgICAgICAgIG1lZC5hZ2VfQ0kgPSAobWVkLmFnZV9TRCAvIHNxcnQoQ291bnQpKSAqIDEuOTYpDQoNCm5TY2VuYXJpbzwtIGRhdCAlPiUgDQogIGRpc3RpbmN0KFNjZW5hcmlvLCBNb2RlbFJ1bikgJT4lIA0KICBncm91cF9ieShTY2VuYXJpbykgJT4lIA0KICBzdW1tYXJpc2UoQ291bnQgPSBuKCkpDQoNCiMjIyMgRGV0ZXJtaW5lIG1heCB5ZWFyIGZvciBlYWNoIHJ1biAjIyMjDQptYXhZcjwtIGRhdCAlPiUgDQogIGdyb3VwX2J5KFNjZW5hcmlvLCBNb2RlbFJ1bikgJT4lIA0KICBmaWx0ZXIoeXIgPT0gbWF4KHlyKSkgJT4lIA0KICBtdXRhdGUoUG9wU3Vydml2ZSA9IGNhc2Vfd2hlbihwb3Auc2l6ZSA8IDIgfiAiRXh0aXJwYXRlZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiU3Vydml2ZWQiKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBncm91cF9ieShTY2VuYXJpbywgUG9wU3Vydml2ZSkgJT4lIA0KICBzdW1tYXJpc2UoTWVhbiA9IG1lYW4oeXIpLA0KICAgICAgICAgICAgU0QgPSBzZCh5ciksDQogICAgICAgICAgICBRMDMgPSBxdWFudGlsZSh5ciwgcHJvYnMgPSAwLjAzKSwNCiAgICAgICAgICAgIFE5NyA9IHF1YW50aWxlKHlyLCBwcm9icyA9IDAuOTcpLA0KICAgICAgICAgICAgQ291bnQgPSBuKCkpICU+JSANCiAgbXV0YXRlKENJOTUgPSAoU0QgLyBzcXJ0KENvdW50KSkgKiAxLjk2KSAlPiUgDQogIHBpdm90X3dpZGVyKGlkX2NvbHMgPSBTY2VuYXJpbywgbmFtZXNfZnJvbSA9IFBvcFN1cnZpdmUsIHZhbHVlc19mcm9tID0gYyhNZWFuLCBDSTk1LCBRMDMsIFE5NywgQ291bnQpKSAlPiUgDQogIG11dGF0ZShDb3VudF9TdXJ2aXZlZCA9IHJlcGxhY2VfbmEoQ291bnRfU3Vydml2ZWQsIDApLA0KICAgICAgICAgQ291bnRfRXh0aXJwYXRlZCA9IHJlcGxhY2VfbmEoQ291bnRfRXh0aXJwYXRlZCwgMCkpICU+JSANCiAgbXV0YXRlKFByb3BTdXJ2aXZlID0gQ291bnRfU3Vydml2ZWQgLyAoQ291bnRfU3Vydml2ZWQgKyBDb3VudF9FeHRpcnBhdGVkKSwNCiAgICAgICAgIEVuZFJlc3VsdCA9IGNhc2Vfd2hlbihDb3VudF9TdXJ2aXZlZCA+IDAgJiBDb3VudF9FeHRpcnBhdGVkID4gMCB+ICJNaXhlZCBSZXN1bHQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50X0V4dGlycGF0ZWQgPT0gMCB+ICJBbGwgU3Vydml2ZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50X1N1cnZpdmVkID09IDAgfiAiQWxsIENyYXNoZWQiKSkNCg0KIyBMb29wIHRocm91Z2ggdGhlIHJvd3MgYW5kIHBvcHVsYXRlIHRoZSBtb2RlbCBwYXJhbWV0ZXJzDQpnZXRNb2RlbFBhcmFtczwtIGZ1bmN0aW9uKHgpew0KICByZXR1cm4oZnJvbUpTT04oeCkgJT4lIA0KICAgICAgICAgICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gUGFyYW1ldGVyLCB2YWx1ZXNfZnJvbSA9IExldmVsKSkNCn0NCg0KdG1wUGFyYW08LSBkYXRhLmZyYW1lKCkNCmZvcihpIGluIDE6bnJvdyhtYXhZcikpew0KICB0bXBQYXJhbTwtIHJiaW5kKHRtcFBhcmFtLCBkYXRhLmZyYW1lKFNjZW5hcmlvID0gbWF4WXIkU2NlbmFyaW9baV0sIGdldE1vZGVsUGFyYW1zKG1heFlyJFNjZW5hcmlvW2ldKSkpDQp9DQoNCiMgQmluZCB0aGUgdGFibGVzDQptYXhZcjwtIG1heFlyICU+JSANCiAgbGVmdF9qb2luKHRtcFBhcmFtLCBieSA9ICJTY2VuYXJpbyIpDQoNCm1heFlyPC0gbWF4WXIgJT4lIA0KICBtdXRhdGUoQm9sZG5lc3MgPSBvcmRlcmVkKEJvbGRuZXNzLCBjKCJza2V3TG93IiwgInNrZXdNZWRMb3ciLCAidW5pZm9ybSIsICJza2V3TWVkSGlnaCIsICJza2V3SGlnaCIpKSwNCiAgICAgICAgIFBvaXNMYW1iZGEgPSBvcmRlcmVkKFBvaXNMYW1iZGEsIGMoIkxvdyIsICJNZWRMb3ciLCAiTWVkIiwgIk1lZEhpZ2giLCAiSGlnaCIpKSwNCiAgICAgICAgIEluZm9UcmFuc2ZlciA9IG9yZGVyZWQoSW5mb1RyYW5zZmVyLCBjKCJMb3ciLCAiTWVkTG93IiwgIk1lZCIsICJNZWRIaWdoIiwgIkhpZ2giKSksDQogICAgICAgICBJbmZvRGVhdGggPSBvcmRlcmVkKEluZm9EZWF0aCwgYygiTG93IiwgIk1lZExvdyIsICJNZWQiLCAiTWVkSGlnaCIsICJIaWdoIikpLA0KICAgICAgICAgTmFpdmVMZWFybiA9IG9yZGVyZWQoTmFpdmVMZWFybiwgYygiTG93IiwgIk1lZExvdyIsICJNZWQiLCAiTWVkSGlnaCIsICJIaWdoIikpKQ0KYGBgDQoNCiMjIyBCZWxvdyBhcmUgdGhlIGtleXMgdG8gaW50ZXJwcmV0aW5nIHRoZSBkaWZmZXJlbnQgcGFyYW1ldGVyICdsZXZlbHMnIG9mIGVhY2ggU2NlbmFyaW8uIFdlIGhhdmUgYSB0b3RhbCBvZiAxMiw1MDAgdW5pcXVlIFNjZW5hcmlvcw0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQprYWJsZShkSywgY2FwdGlvbiA9ICJWaXRhbCBSYXRlcywgSyBTZWxlY3RlZCIpICU+JSANCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmb250X3NpemUgPSAxMikgJT4lIA0KICAgcm93X3NwZWMoMCwgYm9sZCA9IFRSVUUpDQprYWJsZShkUiwgY2FwdGlvbiA9ICJWaXRhbCBSYXRlcywgUiBTZWxlY3RlZCIpICU+JSANCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmb250X3NpemUgPSAxMikgJT4lIA0KICAgcm93X3NwZWMoMCwgYm9sZCA9IFRSVUUpDQoNCmthYmxlKGJvbGREaXN0LCBjYXB0aW9uID0gIkJvbGRuZXNzIHJiZXRhIFNoYXBlIFBhcmFtZXRlcnMiKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFLCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZm9udF9zaXplID0gMTIpICU+JSANCiAgIHJvd19zcGVjKDAsIGJvbGQgPSBUUlVFKQ0KDQprYWJsZShwYXJhbXMsIGNhcHRpb24gPSAiUG9pc3NvbiBMYW1iZGEsIEluZm9ybWF0aW9uIFRyYW5zZmVyLCBhbmQgTmFpdmUgTGVhcm5pbmciKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFLCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZm9udF9zaXplID0gMTIpICU+JSANCiAgIHJvd19zcGVjKDAsIGJvbGQgPSBUUlVFKQ0KDQprYWJsZSh2ZXJ0VHJhbnNtaXNzaW9uLCBjYXB0aW9uID0gIlZlcnRpY2FsIFRyYW5zbWlzc2lvbiIpICU+JSANCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmb250X3NpemUgPSAxMikgJT4lIA0KICAgcm93X3NwZWMoMCwgYm9sZCA9IFRSVUUpDQoNCmBgYA0KPGhyPiANCg0KIyMjIEJveHBsb3RzIG9uIHRoZSBnZW5lcmFsIGVmZmVjdHMgb2YgZWFjaCBwYXJhbWV0ZXINCg0KIyMjIyBUaGUgeC1heGlzIGxhYmVscyBmb2xsb3cgdGhpcyBwYXR0ZXJuOiAqKidWaXRhbHMgLSBFbmQgUmVzdWx0IC0gUGFyYW1ldGVyIExldmVsIC0gTWVhbiBQYXJhbWV0ZXIgVmFsdWUgKGZvciBzdXJ2aXZlZCBhbmQgZXh0aXJwYXRlZCByZXN1bHRzKScqKi4gVGhpcyBpcyBhY3Jvc3MgYWxsIHNjZW5hcmlvcywgd2l0aCBlYWNoIHNjZW5hcmlvIGhhdmluZyA1MCBpdGVyYXRpb25zLiBTbyB0aGVzZSBkYXRhIGFyZSBncm91cGVkIHRvIGEgY2VydGFpbiBleHRlbnQgdG8gcHJvdmlkZSB5b3Ugd2l0aCBnZW5lcmFsIHBhdHRlcm5zLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTl9DQpncmlkLmFycmFuZ2UoDQptYXhZciAlPiUgDQogIGdyb3VwX2J5KEVuZFJlc3VsdCwgVml0YWwpICU+JSANCiAgc3VtbWFyaXNlKENvdW50ID0gbigpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IEVuZFJlc3VsdCwgeSA9IENvdW50LCBmaWxsID0gVml0YWwpKSArDQogIGdlb21fY29sKCkgKw0KICBnZ3RpdGxlKCIjIG9mIFNjZW5hcmlvcyBieSBFbmQgUmVzdWx0IFxuICg1MCBpdGVyYXRpb25zIC8gc2NlbmFyaW8pIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpLA0KbWF4WXIgJT4lIA0KICBzZWxlY3QoU2NlbmFyaW8sIE1lYW5fU3Vydml2ZWQsIE1lYW5fRXh0aXJwYXRlZCwgVml0YWwsIEVuZFJlc3VsdCkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoTWVhbl9TdXJ2aXZlZCwgTWVhbl9FeHRpcnBhdGVkKSwgbmFtZXNfdG8gPSAiUGFyYW0iLCB2YWx1ZXNfdG8gPSAiTWVhblllYXJzIiwgdmFsdWVzX2Ryb3BfbmEgPSBUUlVFKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHBhc3RlKFZpdGFsLCBFbmRSZXN1bHQsIFBhcmFtKSwgeSA9IE1lYW5ZZWFycykpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBnZ3RpdGxlKCJNZWFuIFllYXJzIHRvIEsgb3IgQ3Jhc2ggYnkgVml0YWxzIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpLA0KbmNvbCA9IDIpDQoNCiMgQm94cGxvdCBvZiBNZWFuIFllYXJzIHRvIENhcnJ5aW5nIGNhcGFjaXR5IGJ5IFZpdGFsIHJhdGUgYW5kIEJvbGRuZXNzIGxldmVsDQptYXhZciAlPiUgDQogIHNlbGVjdChTY2VuYXJpbywgTWVhbl9TdXJ2aXZlZCwgTWVhbl9FeHRpcnBhdGVkLCBWaXRhbCwgQm9sZG5lc3MsIEVuZFJlc3VsdCkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoTWVhbl9TdXJ2aXZlZCwgTWVhbl9FeHRpcnBhdGVkKSwgbmFtZXNfdG8gPSAiUGFyYW0iLCB2YWx1ZXNfdG8gPSAiTWVhblllYXJzIiwgdmFsdWVzX2Ryb3BfbmEgPSBUUlVFKSAlPiUgDQogIG11dGF0ZSh4Y29sID0gcGFzdGUoVml0YWwsIEVuZFJlc3VsdCwgQm9sZG5lc3MsIFBhcmFtKSkgJT4lIA0KICBtdXRhdGUoeGNvbCA9IG9yZGVyZWQoeGNvbCwgYygiS3NlbGVjdGVkIEFsbCBTdXJ2aXZlZCBza2V3TG93IE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIEFsbCBTdXJ2aXZlZCBza2V3TWVkTG93IE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIEFsbCBTdXJ2aXZlZCB1bmlmb3JtIE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIEFsbCBTdXJ2aXZlZCBza2V3TWVkSGlnaCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBBbGwgU3Vydml2ZWQgc2tld0hpZ2ggTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IHNrZXdMb3cgTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IHNrZXdMb3cgTWVhbl9FeHRpcnBhdGVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgc2tld01lZExvdyBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgc2tld01lZExvdyBNZWFuX0V4dGlycGF0ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCB1bmlmb3JtIE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCB1bmlmb3JtIE1lYW5fRXh0aXJwYXRlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IHNrZXdNZWRIaWdoIE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBza2V3TWVkSGlnaCBNZWFuX0V4dGlycGF0ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBza2V3SGlnaCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgc2tld0hpZ2ggTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgc2tld0xvdyBNZWFuX1N1cnZpdmVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgc2tld0xvdyBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBza2V3TWVkTG93IE1lYW5fU3Vydml2ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBza2V3TWVkTG93IE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IHVuaWZvcm0gTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IHVuaWZvcm0gTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgc2tld01lZEhpZ2ggTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IHNrZXdNZWRIaWdoIE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IHNrZXdIaWdoIE1lYW5fU3Vydml2ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBza2V3SGlnaCBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIEFsbCBDcmFzaGVkIHNrZXdMb3cgTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBBbGwgQ3Jhc2hlZCBza2V3TWVkTG93IE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgQWxsIENyYXNoZWQgdW5pZm9ybSBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIEFsbCBDcmFzaGVkIHNrZXdNZWRIaWdoIE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgQWxsIENyYXNoZWQgc2tld0hpZ2ggTWVhbl9FeHRpcnBhdGVkIikpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHhjb2wsIHkgPSBNZWFuWWVhcnMpKSArIA0KICBnZW9tX2JveHBsb3QoKSArDQogIGdndGl0bGUoIk1lYW4gWWVhcnMgdG8gSyBvciBDcmFzaCBieSBCb2xkbmVzcyIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQ0KDQojIEJveHBsb3Qgb2YgTWVhbiBZZWFycyB0byBDYXJyeWluZyBjYXBhY2l0eSBieSBWaXRhbCByYXRlIGFuZCBQb2lzc29uIExhbWJkYSBsZXZlbA0KbWF4WXIgJT4lIA0KICBzZWxlY3QoU2NlbmFyaW8sIE1lYW5fU3Vydml2ZWQsIE1lYW5fRXh0aXJwYXRlZCwgVml0YWwsIFBvaXNMYW1iZGEsIEVuZFJlc3VsdCkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoTWVhbl9TdXJ2aXZlZCwgTWVhbl9FeHRpcnBhdGVkKSwgbmFtZXNfdG8gPSAiUGFyYW0iLCB2YWx1ZXNfdG8gPSAiTWVhblllYXJzIiwgdmFsdWVzX2Ryb3BfbmEgPSBUUlVFKSAlPiUgDQogIG11dGF0ZSh4Y29sID0gcGFzdGUoVml0YWwsIEVuZFJlc3VsdCwgUG9pc0xhbWJkYSwgUGFyYW0pKSAlPiUgDQogIG11dGF0ZSh4Y29sID0gb3JkZXJlZCh4Y29sLCBjKCJLc2VsZWN0ZWQgQWxsIFN1cnZpdmVkIExvdyBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBBbGwgU3Vydml2ZWQgTWVkTG93IE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIEFsbCBTdXJ2aXZlZCBNZWQgTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgQWxsIFN1cnZpdmVkIE1lZEhpZ2ggTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgQWxsIFN1cnZpdmVkIEhpZ2ggTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IExvdyBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTG93IE1lYW5fRXh0aXJwYXRlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZExvdyBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkTG93IE1lYW5fRXh0aXJwYXRlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkIE1lYW5fRXh0aXJwYXRlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZEhpZ2ggTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZEhpZ2ggTWVhbl9FeHRpcnBhdGVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgSGlnaCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgSGlnaCBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBMb3cgTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IExvdyBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWRMb3cgTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZExvdyBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWQgTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZCBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWRIaWdoIE1lYW5fU3Vydml2ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWRIaWdoIE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IEhpZ2ggTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IEhpZ2ggTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBBbGwgQ3Jhc2hlZCBMb3cgTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBBbGwgQ3Jhc2hlZCBNZWRMb3cgTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBBbGwgQ3Jhc2hlZCBNZWQgTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBBbGwgQ3Jhc2hlZCBNZWRIaWdoIE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgQWxsIENyYXNoZWQgSGlnaCBNZWFuX0V4dGlycGF0ZWQiKSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0geGNvbCwgeSA9IE1lYW5ZZWFycykpICsgDQogIGdlb21fYm94cGxvdCgpICsNCiAgZ2d0aXRsZSgiTWVhbiBZZWFycyB0byBLIG9yIENyYXNoIGJ5IFBvaXNzb24gTGFtYmRhIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpDQoNCiMgQm94cGxvdCBvZiBNZWFuIFllYXJzIHRvIENhcnJ5aW5nIGNhcGFjaXR5IGJ5IFZpdGFsIHJhdGUgYW5kIEluZm9UcmFuc2ZlciBsZXZlbA0KbWF4WXIgJT4lIA0KICBzZWxlY3QoU2NlbmFyaW8sIE1lYW5fU3Vydml2ZWQsIE1lYW5fRXh0aXJwYXRlZCwgVml0YWwsIEluZm9UcmFuc2ZlciwgRW5kUmVzdWx0KSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhNZWFuX1N1cnZpdmVkLCBNZWFuX0V4dGlycGF0ZWQpLCBuYW1lc190byA9ICJQYXJhbSIsIHZhbHVlc190byA9ICJNZWFuWWVhcnMiLCB2YWx1ZXNfZHJvcF9uYSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKHhjb2wgPSBwYXN0ZShWaXRhbCwgRW5kUmVzdWx0LCBJbmZvVHJhbnNmZXIsIFBhcmFtKSkgJT4lIA0KICBtdXRhdGUoeGNvbCA9IG9yZGVyZWQoeGNvbCwgYygiS3NlbGVjdGVkIEFsbCBTdXJ2aXZlZCBMb3cgTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgQWxsIFN1cnZpdmVkIE1lZExvdyBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBBbGwgU3Vydml2ZWQgTWVkIE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIEFsbCBTdXJ2aXZlZCBNZWRIaWdoIE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIEFsbCBTdXJ2aXZlZCBIaWdoIE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBMb3cgTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IExvdyBNZWFuX0V4dGlycGF0ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWRMb3cgTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZExvdyBNZWFuX0V4dGlycGF0ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWQgTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZCBNZWFuX0V4dGlycGF0ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWRIaWdoIE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWRIaWdoIE1lYW5fRXh0aXJwYXRlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IEhpZ2ggTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IEhpZ2ggTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTG93IE1lYW5fU3Vydml2ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBMb3cgTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkTG93IE1lYW5fU3Vydml2ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWRMb3cgTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkIE1lYW5fU3Vydml2ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWQgTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkSGlnaCBNZWFuX1N1cnZpdmVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkSGlnaCBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBIaWdoIE1lYW5fU3Vydml2ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBIaWdoIE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgQWxsIENyYXNoZWQgTG93IE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgQWxsIENyYXNoZWQgTWVkTG93IE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgQWxsIENyYXNoZWQgTWVkIE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgQWxsIENyYXNoZWQgTWVkSGlnaCBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIEFsbCBDcmFzaGVkIEhpZ2ggTWVhbl9FeHRpcnBhdGVkIikpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHhjb2wsIHkgPSBNZWFuWWVhcnMpKSArIA0KICBnZW9tX2JveHBsb3QoKSArDQogIGdndGl0bGUoIk1lYW4gWWVhcnMgdG8gSyBvciBDcmFzaCBieSBJbmZvVHJhbnNmZXIiKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkNCg0KIyBCb3hwbG90IG9mIE1lYW4gWWVhcnMgdG8gQ2FycnlpbmcgY2FwYWNpdHkgYnkgVml0YWwgcmF0ZSBhbmQgSW5mb0RlYXRoIGxldmVsDQptYXhZciAlPiUgDQogIHNlbGVjdChTY2VuYXJpbywgTWVhbl9TdXJ2aXZlZCwgTWVhbl9FeHRpcnBhdGVkLCBWaXRhbCwgSW5mb0RlYXRoLCBFbmRSZXN1bHQpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKE1lYW5fU3Vydml2ZWQsIE1lYW5fRXh0aXJwYXRlZCksIG5hbWVzX3RvID0gIlBhcmFtIiwgdmFsdWVzX3RvID0gIk1lYW5ZZWFycyIsIHZhbHVlc19kcm9wX25hID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoeGNvbCA9IHBhc3RlKFZpdGFsLCBFbmRSZXN1bHQsIEluZm9EZWF0aCwgUGFyYW0pKSAlPiUgDQogIG11dGF0ZSh4Y29sID0gb3JkZXJlZCh4Y29sLCBjKCJLc2VsZWN0ZWQgQWxsIFN1cnZpdmVkIExvdyBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBBbGwgU3Vydml2ZWQgTWVkTG93IE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIEFsbCBTdXJ2aXZlZCBNZWQgTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgQWxsIFN1cnZpdmVkIE1lZEhpZ2ggTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgQWxsIFN1cnZpdmVkIEhpZ2ggTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IExvdyBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTG93IE1lYW5fRXh0aXJwYXRlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZExvdyBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkTG93IE1lYW5fRXh0aXJwYXRlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkIE1lYW5fRXh0aXJwYXRlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZEhpZ2ggTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZEhpZ2ggTWVhbl9FeHRpcnBhdGVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgSGlnaCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgSGlnaCBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBMb3cgTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IExvdyBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWRMb3cgTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZExvdyBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWQgTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZCBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWRIaWdoIE1lYW5fU3Vydml2ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWRIaWdoIE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IEhpZ2ggTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IEhpZ2ggTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBBbGwgQ3Jhc2hlZCBMb3cgTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBBbGwgQ3Jhc2hlZCBNZWRMb3cgTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBBbGwgQ3Jhc2hlZCBNZWQgTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBBbGwgQ3Jhc2hlZCBNZWRIaWdoIE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgQWxsIENyYXNoZWQgSGlnaCBNZWFuX0V4dGlycGF0ZWQiKSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0geGNvbCwgeSA9IE1lYW5ZZWFycykpICsgDQogIGdlb21fYm94cGxvdCgpICsNCiAgZ2d0aXRsZSgiTWVhbiBZZWFycyB0byBLIG9yIENyYXNoIGJ5IEluZm9EZWF0aCIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQ0KDQojIEJveHBsb3Qgb2YgTWVhbiBZZWFycyB0byBDYXJyeWluZyBjYXBhY2l0eSBieSBWaXRhbCByYXRlIGFuZCBOYWl2ZUxlYXJuIGxldmVsDQptYXhZciAlPiUgDQogIHNlbGVjdChTY2VuYXJpbywgTWVhbl9TdXJ2aXZlZCwgTWVhbl9FeHRpcnBhdGVkLCBWaXRhbCwgTmFpdmVMZWFybiwgRW5kUmVzdWx0KSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhNZWFuX1N1cnZpdmVkLCBNZWFuX0V4dGlycGF0ZWQpLCBuYW1lc190byA9ICJQYXJhbSIsIHZhbHVlc190byA9ICJNZWFuWWVhcnMiLCB2YWx1ZXNfZHJvcF9uYSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKHhjb2wgPSBwYXN0ZShWaXRhbCwgRW5kUmVzdWx0LCBOYWl2ZUxlYXJuLCBQYXJhbSkpICU+JSANCiAgbXV0YXRlKHhjb2wgPSBvcmRlcmVkKHhjb2wsIGMoIktzZWxlY3RlZCBBbGwgU3Vydml2ZWQgTG93IE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIEFsbCBTdXJ2aXZlZCBNZWRMb3cgTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgQWxsIFN1cnZpdmVkIE1lZCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBBbGwgU3Vydml2ZWQgTWVkSGlnaCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBBbGwgU3Vydml2ZWQgSGlnaCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTG93IE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBMb3cgTWVhbl9FeHRpcnBhdGVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkTG93IE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWRMb3cgTWVhbl9FeHRpcnBhdGVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkIE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWQgTWVhbl9FeHRpcnBhdGVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkSGlnaCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkSGlnaCBNZWFuX0V4dGlycGF0ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBIaWdoIE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBIaWdoIE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IExvdyBNZWFuX1N1cnZpdmVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTG93IE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZExvdyBNZWFuX1N1cnZpdmVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkTG93IE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZCBNZWFuX1N1cnZpdmVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkIE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZEhpZ2ggTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZEhpZ2ggTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgSGlnaCBNZWFuX1N1cnZpdmVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgSGlnaCBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIEFsbCBDcmFzaGVkIExvdyBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIEFsbCBDcmFzaGVkIE1lZExvdyBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIEFsbCBDcmFzaGVkIE1lZCBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIEFsbCBDcmFzaGVkIE1lZEhpZ2ggTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBBbGwgQ3Jhc2hlZCBIaWdoIE1lYW5fRXh0aXJwYXRlZCIpKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSB4Y29sLCB5ID0gTWVhblllYXJzKSkgKyANCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBnZ3RpdGxlKCJNZWFuIFllYXJzIHRvIEsgb3IgQ3Jhc2ggYnkgTmFpdmVMZWFybiIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQ0KDQojIEJveHBsb3Qgb2YgTWVhbiBZZWFycyB0byBDYXJyeWluZyBjYXBhY2l0eSBieSBWaXRhbCByYXRlIGFuZCBWZXJ0aWNhbCBUcmFuc2ZlciBsZXZlbA0KbWF4WXIgJT4lIA0KICBzZWxlY3QoU2NlbmFyaW8sIE1lYW5fU3Vydml2ZWQsIE1lYW5fRXh0aXJwYXRlZCwgVml0YWwsIFZlcnRUcmFucywgRW5kUmVzdWx0KSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhNZWFuX1N1cnZpdmVkLCBNZWFuX0V4dGlycGF0ZWQpLCBuYW1lc190byA9ICJQYXJhbSIsIHZhbHVlc190byA9ICJNZWFuWWVhcnMiLCB2YWx1ZXNfZHJvcF9uYSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKHhjb2wgPSBwYXN0ZShWaXRhbCwgRW5kUmVzdWx0LCBWZXJ0VHJhbnMsIFBhcmFtKSkgJT4lIA0KICBtdXRhdGUoeGNvbCA9IG9yZGVyZWQoeGNvbCwgYygiS3NlbGVjdGVkIEFsbCBTdXJ2aXZlZCBGYWxzZSBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBBbGwgU3Vydml2ZWQgVHJ1ZSBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgRmFsc2UgTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IEZhbHNlIE1lYW5fRXh0aXJwYXRlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IFRydWUgTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IFRydWUgTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgRmFsc2UgTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IEZhbHNlIE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IFRydWUgTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IFRydWUgTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBBbGwgQ3Jhc2hlZCBGYWxzZSBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIEFsbCBDcmFzaGVkIFRydWUgTWVhbl9FeHRpcnBhdGVkIikpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHhjb2wsIHkgPSBNZWFuWWVhcnMpKSArIA0KICBnZW9tX2JveHBsb3QoKSArDQogIGdndGl0bGUoIk1lYW4gWWVhcnMgdG8gSyBvciBDcmFzaCBieSBWZXJ0aWNhbCBUcmFuc2ZlciIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQ0KDQpgYGANCg0KIyMjIEF0dGVtcHQgdG8gdHJ5IGFuZCBxdWFudGlmeSB0aGUgcmVzdWx0cyBvZiB0aGUgYWJvdmUgcGxvdHMNCg0KQnkgdGFraW5nIHRoZSBzYW1lIGRhdGEgdGhlIHRoZSBCb3ggUGxvdHMgYXJlIGJhc2VkIG9mZiBvZiwgSSBmaXQgaW5kaXZpZHVhbCBsaW5lYXIgbW9kZWxzIChBTk9WQSkgdG8gZWFjaCBkYXRhc2V0LCBpbiB0aGUgZm9yIG9mICpNZWFuWWVhcnMgfiBTY2VuYXJpbyouIEkgdGhlbiBjYXB0dXJlZCB0aGUgRXN0aW1hdGVzIGZvciBlYWNoIFNjZW5hcmlvIGludG8gYSB0YWJsZSBhbmQgZWFjaCBjb2x1bW4gaXMgdGhlIG1vZGVsIHBhcmFtZXRlciBlc3RpbWF0ZSBmb3IgdGhlIHNjZW5hcmlvIGdpdmVuIHRoYXQgcGFyYW1ldGVyLiBUaGlzIHdhcyB0aGUgZmlyc3QgbWV0aG9kIHRoYXQgcG9wcGVkIGludG8gbXkgaGVhZCB0byB0cnkgYW5kIGNvbXBhcmUgZWZmZWN0IHNpemVzIGJldHdlZW4gZGlmZmVyZW50IElCTSBwYXJhbWV0ZXJzLiBJIHRoZW4gcGVyZm9ybWVkIGEgY29tcGxldGUgUGFpcndpc2UgQ29udHJhc3QgYmV0d2VlbiBhbGwgc2NlbmFyaW9zIHdpdGhpbiBhIHBhcmFtZXRlciBtb2RlbC4gVGhlIHNjYXR0ZXIgcGxvdHMgYmVsb3cgYXJlIHNvbWUgZ3JhcGhpY2FsIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgY292YXJpYXRpb24gYmV0d2VlbiB0d28gSUJNIHBhcmFtZXRlcnMgaW4gKipFZmZlY3Qtc2l6ZSBTcGFjZSoqLiBJIGhvcGUgdGhpcyBtYWtlcyBzZW5zZSBhbmQgaXMgc29tZXdoYXQgdXNlZnVsLiBBbGwgcGFyYW1ldGVycyBzZWVtcyB0byBjb3ZhcnkgcG9zaXRpdmVseSB3aXRoIHRoZSBvdGhlcnMsIGJ1dCB0aGVyZSBhcmUgc29tZSBwYXR0ZXJucyB3aGVuIHlvdSBsb29rIGFjcm9zcyB0aGUgSyB2cyBSIHNlbGVjdGVkIHNwYWNlIGFuZCB3aGV0aGVyIHRoZSBtb2RlbCBwb3B1bGF0aW9ucyBzdXJ2aXZlZCBvciB3ZXJlIGV4dGlycGF0ZWQuIFRoZSBwbG90cyBhcmUgZHluYW1pYywgc28geW91IGNhbiB0dXJuIG9uL29mZiBlYWNoIHBvaW50IGJ5IGRvdWJsZS1jbGlja2luZyBpbiB0aGUgbGVnZW5kIGFuZCBob3ZlciBhbGxvd3MgeW91IHRvIHNlZSB2YWx1ZXMuIA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTksIGZpZy53aWR0aD05fQ0KaWJtQm9sZDwtIG1heFlyICU+JSANCiAgc2VsZWN0KFNjZW5hcmlvLCBNZWFuX1N1cnZpdmVkLCBNZWFuX0V4dGlycGF0ZWQsIFZpdGFsLCBCb2xkbmVzcywgRW5kUmVzdWx0KSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhNZWFuX1N1cnZpdmVkLCBNZWFuX0V4dGlycGF0ZWQpLCBuYW1lc190byA9ICJQYXJhbSIsIHZhbHVlc190byA9ICJNZWFuWWVhcnMiLCB2YWx1ZXNfZHJvcF9uYSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKHhjb2wgPSBwYXN0ZShWaXRhbCwgRW5kUmVzdWx0LCBCb2xkbmVzcywgUGFyYW0pKSAlPiUgDQogIG11dGF0ZSh4Y29sID0gb3JkZXJlZCh4Y29sLCBjKCJLc2VsZWN0ZWQgQWxsIFN1cnZpdmVkIHNrZXdMb3cgTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgQWxsIFN1cnZpdmVkIHNrZXdNZWRMb3cgTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgQWxsIFN1cnZpdmVkIHVuaWZvcm0gTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgQWxsIFN1cnZpdmVkIHNrZXdNZWRIaWdoIE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIEFsbCBTdXJ2aXZlZCBza2V3SGlnaCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgc2tld0xvdyBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgc2tld0xvdyBNZWFuX0V4dGlycGF0ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBza2V3TWVkTG93IE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBza2V3TWVkTG93IE1lYW5fRXh0aXJwYXRlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IHVuaWZvcm0gTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IHVuaWZvcm0gTWVhbl9FeHRpcnBhdGVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgc2tld01lZEhpZ2ggTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IHNrZXdNZWRIaWdoIE1lYW5fRXh0aXJwYXRlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IHNrZXdIaWdoIE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBza2V3SGlnaCBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBza2V3TG93IE1lYW5fU3Vydml2ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBza2V3TG93IE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IHNrZXdNZWRMb3cgTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IHNrZXdNZWRMb3cgTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgdW5pZm9ybSBNZWFuX1N1cnZpdmVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgdW5pZm9ybSBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBza2V3TWVkSGlnaCBNZWFuX1N1cnZpdmVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgc2tld01lZEhpZ2ggTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgc2tld0hpZ2ggTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IHNrZXdIaWdoIE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgQWxsIENyYXNoZWQgc2tld0xvdyBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIEFsbCBDcmFzaGVkIHNrZXdNZWRMb3cgTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBBbGwgQ3Jhc2hlZCB1bmlmb3JtIE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgQWxsIENyYXNoZWQgc2tld01lZEhpZ2ggTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBBbGwgQ3Jhc2hlZCBza2V3SGlnaCBNZWFuX0V4dGlycGF0ZWQiKSkpIA0KDQojIEZpdCBhIG1vZGVsDQptb2RCb2xkPC0gYW92KE1lYW5ZZWFycyB+IHhjb2wsIGRhdGEgPSBpYm1Cb2xkKQ0KIyBHZXQgcGFpcndpc2UgY29udHJhc3RzIG9mIGVhY2ggc2NlbmFyaW8NCmNvbkJvbGRQYWlyPC0gc3VtbWFyeShwYWlycyhhcy5lbW1HcmlkKGFzLmxpc3QocmVmX2dyaWQobW9kQm9sZCkpKSkpICU+JSANCiAgcmVuYW1lKGVzdGltYXRlX0JvbGQgPSBlc3RpbWF0ZSwNCiAgICAgICAgIHAudmFsdWVfQm9sZCA9IHAudmFsdWUpICU+JSANCiAgbXV0YXRlKGNvbnRyYXN0ID0gc3RyX3JlcGxhY2VfYWxsKGNvbnRyYXN0LCBwYXR0ZXJuID0gInNrZXciLCByZXBsYWNlbWVudCA9ICIiKSkgJT4lIA0KICBtdXRhdGUoY29udHJhc3QgPSBzdHJfcmVwbGFjZV9hbGwoY29udHJhc3QsIHBhdHRlcm4gPSAidW5pZm9ybSIsIHJlcGxhY2VtZW50ID0gIk1lZCIpKQ0KIyBHZXQgbW9kZWwgZXN0aW1hdGVzIG9mIGVhY2ggc2NlbmFyaW8NCmNvbkJvbGQ8LSBzdW1tYXJ5KGNvbnRyYXN0KGFzLmVtbUdyaWQoYXMubGlzdChyZWZfZ3JpZChtb2RCb2xkKSkpKSkgJT4lIA0KICAgcmVuYW1lKGVzdGltYXRlX0JvbGQgPSBlc3RpbWF0ZSwNCiAgICAgICAgIHAudmFsdWVfQm9sZCA9IHAudmFsdWUpICU+JSANCiAgbXV0YXRlKGNvbnRyYXN0ID0gc3RyX3JlcGxhY2VfYWxsKGNvbnRyYXN0LCBwYXR0ZXJuID0gInNrZXciLCByZXBsYWNlbWVudCA9ICIiKSkgJT4lIA0KICBtdXRhdGUoY29udHJhc3QgPSBzdHJfcmVwbGFjZV9hbGwoY29udHJhc3QsIHBhdHRlcm4gPSAidW5pZm9ybSIsIHJlcGxhY2VtZW50ID0gIk1lZCIpKQ0KDQppYm1MYW1iZGE8LSBtYXhZciAlPiUgDQogIHNlbGVjdChTY2VuYXJpbywgTWVhbl9TdXJ2aXZlZCwgTWVhbl9FeHRpcnBhdGVkLCBWaXRhbCwgUG9pc0xhbWJkYSwgRW5kUmVzdWx0KSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhNZWFuX1N1cnZpdmVkLCBNZWFuX0V4dGlycGF0ZWQpLCBuYW1lc190byA9ICJQYXJhbSIsIHZhbHVlc190byA9ICJNZWFuWWVhcnMiLCB2YWx1ZXNfZHJvcF9uYSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKHhjb2wgPSBwYXN0ZShWaXRhbCwgRW5kUmVzdWx0LCBQb2lzTGFtYmRhLCBQYXJhbSkpICU+JSANCiAgbXV0YXRlKHhjb2wgPSBvcmRlcmVkKHhjb2wsIGMoIktzZWxlY3RlZCBBbGwgU3Vydml2ZWQgTG93IE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIEFsbCBTdXJ2aXZlZCBNZWRMb3cgTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgQWxsIFN1cnZpdmVkIE1lZCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBBbGwgU3Vydml2ZWQgTWVkSGlnaCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBBbGwgU3Vydml2ZWQgSGlnaCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTG93IE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBMb3cgTWVhbl9FeHRpcnBhdGVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkTG93IE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWRMb3cgTWVhbl9FeHRpcnBhdGVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkIE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWQgTWVhbl9FeHRpcnBhdGVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkSGlnaCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkSGlnaCBNZWFuX0V4dGlycGF0ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBIaWdoIE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBIaWdoIE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IExvdyBNZWFuX1N1cnZpdmVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTG93IE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZExvdyBNZWFuX1N1cnZpdmVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkTG93IE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZCBNZWFuX1N1cnZpdmVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkIE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZEhpZ2ggTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZEhpZ2ggTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgSGlnaCBNZWFuX1N1cnZpdmVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgSGlnaCBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIEFsbCBDcmFzaGVkIExvdyBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIEFsbCBDcmFzaGVkIE1lZExvdyBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIEFsbCBDcmFzaGVkIE1lZCBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIEFsbCBDcmFzaGVkIE1lZEhpZ2ggTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBBbGwgQ3Jhc2hlZCBIaWdoIE1lYW5fRXh0aXJwYXRlZCIpKSkNCg0KIyBGaXQgYSBtb2RlbA0KbW9kTGFtYmRhPC0gYW92KE1lYW5ZZWFycyB+IHhjb2wsIGRhdGEgPSBpYm1MYW1iZGEpDQojIEdldCBwYWlyd2lzZSBjb250cmFzdHMgb2YgZWFjaCBzY2VuYXJpbw0KY29uTGFtYmRhUGFpcjwtIHN1bW1hcnkocGFpcnMoYXMuZW1tR3JpZChhcy5saXN0KHJlZl9ncmlkKG1vZExhbWJkYSkpKSkpICU+JSANCiAgcmVuYW1lKGVzdGltYXRlX0xhbWJkYSA9IGVzdGltYXRlLA0KICAgICAgICAgcC52YWx1ZV9MYW1iZGEgPSBwLnZhbHVlKQ0KIyBHZXQgbW9kZWwgZXN0aW1hdGVzIG9mIGVhY2ggc2NlbmFyaW8NCmNvbkxhbWJkYTwtIHN1bW1hcnkoY29udHJhc3QoYXMuZW1tR3JpZChhcy5saXN0KHJlZl9ncmlkKG1vZExhbWJkYSkpKSkpICU+JSANCiAgIHJlbmFtZShlc3RpbWF0ZV9MYW1iZGEgPSBlc3RpbWF0ZSwNCiAgICAgICAgIHAudmFsdWVfTGFtYmRhID0gcC52YWx1ZSkNCg0KIyBCb3hwbG90IG9mIE1lYW4gWWVhcnMgdG8gQ2FycnlpbmcgY2FwYWNpdHkgYnkgVml0YWwgcmF0ZSBhbmQgSW5mb1RyYW5zZmVyIGxldmVsDQppYm1JbmZvVHJhbjwtIG1heFlyICU+JSANCiAgc2VsZWN0KFNjZW5hcmlvLCBNZWFuX1N1cnZpdmVkLCBNZWFuX0V4dGlycGF0ZWQsIFZpdGFsLCBJbmZvVHJhbnNmZXIsIEVuZFJlc3VsdCkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoTWVhbl9TdXJ2aXZlZCwgTWVhbl9FeHRpcnBhdGVkKSwgbmFtZXNfdG8gPSAiUGFyYW0iLCB2YWx1ZXNfdG8gPSAiTWVhblllYXJzIiwgdmFsdWVzX2Ryb3BfbmEgPSBUUlVFKSAlPiUgDQogIG11dGF0ZSh4Y29sID0gcGFzdGUoVml0YWwsIEVuZFJlc3VsdCwgSW5mb1RyYW5zZmVyLCBQYXJhbSkpICU+JSANCiAgbXV0YXRlKHhjb2wgPSBvcmRlcmVkKHhjb2wsIGMoIktzZWxlY3RlZCBBbGwgU3Vydml2ZWQgTG93IE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIEFsbCBTdXJ2aXZlZCBNZWRMb3cgTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgQWxsIFN1cnZpdmVkIE1lZCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBBbGwgU3Vydml2ZWQgTWVkSGlnaCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBBbGwgU3Vydml2ZWQgSGlnaCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTG93IE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBMb3cgTWVhbl9FeHRpcnBhdGVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkTG93IE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWRMb3cgTWVhbl9FeHRpcnBhdGVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkIE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWQgTWVhbl9FeHRpcnBhdGVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkSGlnaCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkSGlnaCBNZWFuX0V4dGlycGF0ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBIaWdoIE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBIaWdoIE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IExvdyBNZWFuX1N1cnZpdmVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTG93IE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZExvdyBNZWFuX1N1cnZpdmVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkTG93IE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZCBNZWFuX1N1cnZpdmVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkIE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZEhpZ2ggTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZEhpZ2ggTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgSGlnaCBNZWFuX1N1cnZpdmVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgSGlnaCBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIEFsbCBDcmFzaGVkIExvdyBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIEFsbCBDcmFzaGVkIE1lZExvdyBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIEFsbCBDcmFzaGVkIE1lZCBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIEFsbCBDcmFzaGVkIE1lZEhpZ2ggTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBBbGwgQ3Jhc2hlZCBIaWdoIE1lYW5fRXh0aXJwYXRlZCIpKSkNCg0KIyBGaXQgYSBtb2RlbA0KbW9kSW5mb1RyYW48LSBhb3YoTWVhblllYXJzIH4geGNvbCwgZGF0YSA9IGlibUluZm9UcmFuKQ0KIyBHZXQgcGFpcndpc2UgY29udHJhc3RzIG9mIGVhY2ggc2NlbmFyaW8NCmNvbkluZm9UcmFuUGFpcjwtIHN1bW1hcnkocGFpcnMoYXMuZW1tR3JpZChhcy5saXN0KHJlZl9ncmlkKG1vZEluZm9UcmFuKSkpKSkgJT4lIA0KICByZW5hbWUoZXN0aW1hdGVfSW5mb1RyYW4gPSBlc3RpbWF0ZSwNCiAgICAgICAgIHAudmFsdWVfSW5mb1RyYW4gPSBwLnZhbHVlKQ0KIyBHZXQgbW9kZWwgZXN0aW1hdGVzIG9mIGVhY2ggc2NlbmFyaW8NCmNvbkluZm9UcmFuPC0gc3VtbWFyeShjb250cmFzdChhcy5lbW1HcmlkKGFzLmxpc3QocmVmX2dyaWQobW9kSW5mb1RyYW4pKSkpKSAlPiUgDQogICByZW5hbWUoZXN0aW1hdGVfSW5mb1RyYW4gPSBlc3RpbWF0ZSwNCiAgICAgICAgIHAudmFsdWVfSW5mb1RyYW4gPSBwLnZhbHVlKQ0KDQojIEJveHBsb3Qgb2YgTWVhbiBZZWFycyB0byBDYXJyeWluZyBjYXBhY2l0eSBieSBWaXRhbCByYXRlIGFuZCBJbmZvRGVhdGggbGV2ZWwNCmlibUluZm9EZWF0aDwtIG1heFlyICU+JSANCiAgc2VsZWN0KFNjZW5hcmlvLCBNZWFuX1N1cnZpdmVkLCBNZWFuX0V4dGlycGF0ZWQsIFZpdGFsLCBJbmZvRGVhdGgsIEVuZFJlc3VsdCkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoTWVhbl9TdXJ2aXZlZCwgTWVhbl9FeHRpcnBhdGVkKSwgbmFtZXNfdG8gPSAiUGFyYW0iLCB2YWx1ZXNfdG8gPSAiTWVhblllYXJzIiwgdmFsdWVzX2Ryb3BfbmEgPSBUUlVFKSAlPiUgDQogIG11dGF0ZSh4Y29sID0gcGFzdGUoVml0YWwsIEVuZFJlc3VsdCwgSW5mb0RlYXRoLCBQYXJhbSkpICU+JSANCiAgbXV0YXRlKHhjb2wgPSBvcmRlcmVkKHhjb2wsIGMoIktzZWxlY3RlZCBBbGwgU3Vydml2ZWQgTG93IE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIEFsbCBTdXJ2aXZlZCBNZWRMb3cgTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgQWxsIFN1cnZpdmVkIE1lZCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBBbGwgU3Vydml2ZWQgTWVkSGlnaCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBBbGwgU3Vydml2ZWQgSGlnaCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTG93IE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBMb3cgTWVhbl9FeHRpcnBhdGVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkTG93IE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWRMb3cgTWVhbl9FeHRpcnBhdGVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkIE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWQgTWVhbl9FeHRpcnBhdGVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkSGlnaCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkSGlnaCBNZWFuX0V4dGlycGF0ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBIaWdoIE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIE1peGVkIFJlc3VsdCBIaWdoIE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IExvdyBNZWFuX1N1cnZpdmVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTG93IE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZExvdyBNZWFuX1N1cnZpdmVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkTG93IE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZCBNZWFuX1N1cnZpdmVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkIE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZEhpZ2ggTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZEhpZ2ggTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgSGlnaCBNZWFuX1N1cnZpdmVkIiwgIlJzZWxlY3RlZCBNaXhlZCBSZXN1bHQgSGlnaCBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIEFsbCBDcmFzaGVkIExvdyBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIEFsbCBDcmFzaGVkIE1lZExvdyBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIEFsbCBDcmFzaGVkIE1lZCBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIEFsbCBDcmFzaGVkIE1lZEhpZ2ggTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBBbGwgQ3Jhc2hlZCBIaWdoIE1lYW5fRXh0aXJwYXRlZCIpKSkgDQoNCiMgRml0IGEgbW9kZWwNCm1vZEluZm9EZWF0aDwtIGFvdihNZWFuWWVhcnMgfiB4Y29sLCBkYXRhID0gaWJtSW5mb0RlYXRoKQ0KIyBHZXQgcGFpcndpc2UgY29udHJhc3RzIG9mIGVhY2ggc2NlbmFyaW8NCmNvbkluZm9EZWF0aFBhaXI8LSBzdW1tYXJ5KHBhaXJzKGFzLmVtbUdyaWQoYXMubGlzdChyZWZfZ3JpZChtb2RJbmZvRGVhdGgpKSkpKSAlPiUgDQogIHJlbmFtZShlc3RpbWF0ZV9JbmZvRGVhdGggPSBlc3RpbWF0ZSwNCiAgICAgICAgIHAudmFsdWVfSW5mb0RlYXRoID0gcC52YWx1ZSkNCiMgR2V0IG1vZGVsIGVzdGltYXRlcyBvZiBlYWNoIHNjZW5hcmlvDQpjb25JbmZvRGVhdGg8LSBzdW1tYXJ5KGNvbnRyYXN0KGFzLmVtbUdyaWQoYXMubGlzdChyZWZfZ3JpZChtb2RJbmZvRGVhdGgpKSkpKSAlPiUgDQogICByZW5hbWUoZXN0aW1hdGVfSW5mb0RlYXRoID0gZXN0aW1hdGUsDQogICAgICAgICBwLnZhbHVlX0luZm9EZWF0aCA9IHAudmFsdWUpDQoNCiMgQm94cGxvdCBvZiBNZWFuIFllYXJzIHRvIENhcnJ5aW5nIGNhcGFjaXR5IGJ5IFZpdGFsIHJhdGUgYW5kIE5haXZlTGVhcm4gbGV2ZWwNCmlibU5haXZlPC0gbWF4WXIgJT4lIA0KICBzZWxlY3QoU2NlbmFyaW8sIE1lYW5fU3Vydml2ZWQsIE1lYW5fRXh0aXJwYXRlZCwgVml0YWwsIE5haXZlTGVhcm4sIEVuZFJlc3VsdCkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoTWVhbl9TdXJ2aXZlZCwgTWVhbl9FeHRpcnBhdGVkKSwgbmFtZXNfdG8gPSAiUGFyYW0iLCB2YWx1ZXNfdG8gPSAiTWVhblllYXJzIiwgdmFsdWVzX2Ryb3BfbmEgPSBUUlVFKSAlPiUgDQogIG11dGF0ZSh4Y29sID0gcGFzdGUoVml0YWwsIEVuZFJlc3VsdCwgTmFpdmVMZWFybiwgUGFyYW0pKSAlPiUgDQogIG11dGF0ZSh4Y29sID0gb3JkZXJlZCh4Y29sLCBjKCJLc2VsZWN0ZWQgQWxsIFN1cnZpdmVkIExvdyBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBBbGwgU3Vydml2ZWQgTWVkTG93IE1lYW5fU3Vydml2ZWQiLCAiS3NlbGVjdGVkIEFsbCBTdXJ2aXZlZCBNZWQgTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgQWxsIFN1cnZpdmVkIE1lZEhpZ2ggTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgQWxsIFN1cnZpdmVkIEhpZ2ggTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IExvdyBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTG93IE1lYW5fRXh0aXJwYXRlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZExvdyBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkTG93IE1lYW5fRXh0aXJwYXRlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgTWVkIE1lYW5fRXh0aXJwYXRlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZEhpZ2ggTWVhbl9TdXJ2aXZlZCIsICJLc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZEhpZ2ggTWVhbl9FeHRpcnBhdGVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgSGlnaCBNZWFuX1N1cnZpdmVkIiwgIktzZWxlY3RlZCBNaXhlZCBSZXN1bHQgSGlnaCBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBMb3cgTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IExvdyBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWRMb3cgTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZExvdyBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWQgTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IE1lZCBNZWFuX0V4dGlycGF0ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWRIaWdoIE1lYW5fU3Vydml2ZWQiLCAiUnNlbGVjdGVkIE1peGVkIFJlc3VsdCBNZWRIaWdoIE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IEhpZ2ggTWVhbl9TdXJ2aXZlZCIsICJSc2VsZWN0ZWQgTWl4ZWQgUmVzdWx0IEhpZ2ggTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBBbGwgQ3Jhc2hlZCBMb3cgTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBBbGwgQ3Jhc2hlZCBNZWRMb3cgTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBBbGwgQ3Jhc2hlZCBNZWQgTWVhbl9FeHRpcnBhdGVkIiwgIlJzZWxlY3RlZCBBbGwgQ3Jhc2hlZCBNZWRIaWdoIE1lYW5fRXh0aXJwYXRlZCIsICJSc2VsZWN0ZWQgQWxsIENyYXNoZWQgSGlnaCBNZWFuX0V4dGlycGF0ZWQiKSkpDQoNCiMgRml0IGEgbW9kZWwNCm1vZE5haXZlPC0gYW92KE1lYW5ZZWFycyB+IHhjb2wsIGRhdGEgPSBpYm1OYWl2ZSkNCiMgR2V0IHBhaXJ3aXNlIGNvbnRyYXN0cyBvZiBlYWNoIHNjZW5hcmlvDQpjb25OYWl2ZVBhaXI8LSBzdW1tYXJ5KHBhaXJzKGFzLmVtbUdyaWQoYXMubGlzdChyZWZfZ3JpZChtb2ROYWl2ZSkpKSkpICU+JSANCiAgcmVuYW1lKGVzdGltYXRlX05haXZlID0gZXN0aW1hdGUsDQogICAgICAgICBwLnZhbHVlX05haXZlID0gcC52YWx1ZSkNCiMgR2V0IG1vZGVsIGVzdGltYXRlcyBvZiBlYWNoIHNjZW5hcmlvDQpjb25OYWl2ZTwtIHN1bW1hcnkoY29udHJhc3QoYXMuZW1tR3JpZChhcy5saXN0KHJlZl9ncmlkKG1vZE5haXZlKSkpKSkgJT4lIA0KICAgcmVuYW1lKGVzdGltYXRlX05haXZlID0gZXN0aW1hdGUsDQogICAgICAgICBwLnZhbHVlX05haXZlID0gcC52YWx1ZSkNCg0KYWxsRXN0PC0gY29uQm9sZCAlPiUgDQogIHNlbGVjdChjb250cmFzdCwgZXN0aW1hdGVfQm9sZCkgJT4lIA0KICBsZWZ0X2pvaW4oY29uTGFtYmRhICU+JSBzZWxlY3QoY29udHJhc3QsIGVzdGltYXRlX0xhbWJkYSksIGJ5ID0gImNvbnRyYXN0IikgJT4lIA0KICBsZWZ0X2pvaW4oY29uSW5mb1RyYW4gJT4lIHNlbGVjdChjb250cmFzdCwgZXN0aW1hdGVfSW5mb1RyYW4pLCBieSA9ICJjb250cmFzdCIpICU+JSANCiAgbGVmdF9qb2luKGNvbkluZm9EZWF0aCAlPiUgc2VsZWN0KGNvbnRyYXN0LCBlc3RpbWF0ZV9JbmZvRGVhdGgpLCBieSA9ICJjb250cmFzdCIpICU+JSANCiAgbGVmdF9qb2luKGNvbk5haXZlICU+JSBzZWxlY3QoY29udHJhc3QsIGVzdGltYXRlX05haXZlKSwgYnkgPSAiY29udHJhc3QiKSANCg0KYWxsUGFpcjwtIGNvbkJvbGRQYWlyICU+JSANCiAgc2VsZWN0KGNvbnRyYXN0LCBlc3RpbWF0ZV9Cb2xkKSAlPiUgDQogIGxlZnRfam9pbihjb25MYW1iZGFQYWlyICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGNvbnRyYXN0LCBlc3RpbWF0ZV9MYW1iZGEpLCBieSA9ICJjb250cmFzdCIpICU+JSANCiAgbGVmdF9qb2luKGNvbkluZm9UcmFuUGFpciAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChjb250cmFzdCwgZXN0aW1hdGVfSW5mb1RyYW4pLCBieSA9ICJjb250cmFzdCIpICU+JSANCiAgbGVmdF9qb2luKGNvbkluZm9EZWF0aFBhaXIgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoY29udHJhc3QsIGVzdGltYXRlX0luZm9EZWF0aCksIGJ5ID0gImNvbnRyYXN0IikgJT4lIA0KICBsZWZ0X2pvaW4oY29uTmFpdmVQYWlyICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGNvbnRyYXN0LCBlc3RpbWF0ZV9OYWl2ZSksIGJ5ID0gImNvbnRyYXN0IikgJT4lIA0KICBzZXBhcmF0ZShjb2wgPSBjb250cmFzdCwgaW50byA9IGMoIlN0YXJ0IiwgIkVuZCIpLCBzZXAgPSAiIC0gIiwgcmVtb3ZlID0gRkFMU0UpICU+JSANCiAgbXV0YXRlKFN0YXJ0X1ZpdGFsID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoU3RhcnQsICJLc2VsZWN0ZWQiKSB+ICJLIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiUiIpLA0KICAgICAgICAgRW5kX1ZpdGFsID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoRW5kLCAiS3NlbGVjdGVkIikgfiAiSyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIlIiKSwNCiAgICAgICAgIFN0YXJ0X1Jlc3VsdCA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KFN0YXJ0LCAiU3Vydml2ZWQiKSB+ICJTIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiRSIpLA0KICAgICAgICAgRW5kX1Jlc3VsdCA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KEVuZCwgIlN1cnZpdmVkIikgfiAiUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIkUiKSkgJT4lIA0KICB1bml0ZShjb2wgPSBWaXRhbFJlc3VsdCwgU3RhcnRfVml0YWwsIEVuZF9WaXRhbCwgU3RhcnRfUmVzdWx0LCBFbmRfUmVzdWx0LCBzZXAgPSAiIiwgcmVtb3ZlID0gRkFMU0UpICU+JSANCiAgbXV0YXRlKFZpdGFsUmVzdWx0ID0gYXMuZmFjdG9yKFZpdGFsUmVzdWx0KSkNCg0KDQojIEJvbGQgYW5kIExhbWJkYQ0KbW9kQkw8LSBsbShlc3RpbWF0ZV9Cb2xkIH4gZXN0aW1hdGVfTGFtYmRhLCBkYXRhID0gYWxsUGFpcikNCg0KZ2dwbG90bHkoDQogIGFsbFBhaXIgJT4lIA0KICAgIGdncGxvdChhZXMoZXN0aW1hdGVfTGFtYmRhLCBlc3RpbWF0ZV9Cb2xkLCBncm91cCA9IFZpdGFsUmVzdWx0LCBjb2xvciA9IFZpdGFsUmVzdWx0KSkgKw0KICAgIGdlb21fcG9pbnQoKSArDQogICAgZ2d0aXRsZSgiUGFpcndpc2UgQ29udHJhc3Qgb2YgTGluZWFyIE1vZGVsIEVzdGltYXRlcyBCeSBTY2VuYXJpbyBcbiBNZWFuWWVhciB+IFNjZW5hcmlvIFxuIEVhY2ggYXhpcyByZXByZXNlbnRzIGEgbW9kZWwgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgXG4gSyA9IEtzZWxlY3RlZDsgUiA9IFJzZWxlY3RlZDsgRSA9IEV4dGlycGF0ZWQ7IFMgPSBTdXJ2aXZlZCIpICsNCiAgICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4ID0gLTEwLCB5ID0gMjAsIGxhYmVsID0gcGFzdGUwKCJBZGouIFIyID0gIiwgcm91bmQoc3VtbWFyeShtb2RCTCkkYWRqLnIuc3F1YXJlZCwgMykpKQ0KKQ0KDQojIEJvbGQgYW5kIEluZm9UcmFuDQptb2RCVDwtIGxtKGVzdGltYXRlX0JvbGQgfiBlc3RpbWF0ZV9JbmZvVHJhbiwgZGF0YSA9IGFsbFBhaXIpDQoNCmdncGxvdGx5KA0KICBhbGxQYWlyICU+JSANCiAgICBnZ3Bsb3QoYWVzKGVzdGltYXRlX0luZm9UcmFuLCBlc3RpbWF0ZV9Cb2xkLCBncm91cCA9IFZpdGFsUmVzdWx0LCBjb2xvciA9IFZpdGFsUmVzdWx0KSkgKw0KICAgIGdlb21fcG9pbnQoKSArDQogICAgZ2d0aXRsZSgiUGFpcndpc2UgQ29udHJhc3Qgb2YgTGluZWFyIE1vZGVsIEVzdGltYXRlcyBCeSBTY2VuYXJpbyBcbiBNZWFuWWVhciB+IFNjZW5hcmlvIFxuIEVhY2ggYXhpcyByZXByZXNlbnRzIGEgbW9kZWwgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgXG4gSyA9IEtzZWxlY3RlZDsgUiA9IFJzZWxlY3RlZDsgRSA9IEV4dGlycGF0ZWQ7IFMgPSBTdXJ2aXZlZCIpICsNCiAgICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4ID0gLTEwLCB5ID0gMjAsIGxhYmVsID0gcGFzdGUwKCJBZGouIFIyID0gIiwgcm91bmQoc3VtbWFyeShtb2RCVCkkYWRqLnIuc3F1YXJlZCwgMykpKQ0KKQ0KDQojIEJvbGQgYW5kIEluZm9EZWF0aA0KbW9kQkQ8LSBsbShlc3RpbWF0ZV9Cb2xkIH4gZXN0aW1hdGVfSW5mb0RlYXRoLCBkYXRhID0gYWxsUGFpcikNCg0KZ2dwbG90bHkoDQogIGFsbFBhaXIgJT4lIA0KICAgIGdncGxvdChhZXMoZXN0aW1hdGVfSW5mb0RlYXRoLCBlc3RpbWF0ZV9Cb2xkLCBncm91cCA9IFZpdGFsUmVzdWx0LCBjb2xvciA9IFZpdGFsUmVzdWx0KSkgKw0KICAgIGdlb21fcG9pbnQoKSArDQogICAgZ2d0aXRsZSgiUGFpcndpc2UgQ29udHJhc3Qgb2YgTGluZWFyIE1vZGVsIEVzdGltYXRlcyBCeSBTY2VuYXJpbyBcbiBNZWFuWWVhciB+IFNjZW5hcmlvIFxuIEVhY2ggYXhpcyByZXByZXNlbnRzIGEgbW9kZWwgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXIgXG4gSyA9IEtzZWxlY3RlZDsgUiA9IFJzZWxlY3RlZDsgRSA9IEV4dGlycGF0ZWQ7IFMgPSBTdXJ2aXZlZCIpICsNCiAgICBhbm5vdGF0ZShnZW9tID0gInRleHQiLCB4ID0gLTEwLCB5ID0gMjAsIGxhYmVsID0gcGFzdGUwKCJBZGouIFIyID0gIiwgcm91bmQoc3VtbWFyeShtb2RCRCkkYWRqLnIuc3F1YXJlZCwgMykpKQ0KKQ0KDQoNCiMgQm9sZCBhbmQgTmFpdmUNCm1vZEJOPC0gbG0oZXN0aW1hdGVfQm9sZCB+IGVzdGltYXRlX05haXZlLCBkYXRhID0gYWxsUGFpcikNCg0KZ2dwbG90bHkoDQogIGFsbFBhaXIgJT4lIA0KICAgIGdncGxvdChhZXMoZXN0aW1hdGVfTmFpdmUsIGVzdGltYXRlX0JvbGQsIGdyb3VwID0gVml0YWxSZXN1bHQsIGNvbG9yID0gVml0YWxSZXN1bHQpKSArDQogICAgZ2VvbV9wb2ludCgpICsNCiAgICBnZ3RpdGxlKCJQYWlyd2lzZSBDb250cmFzdCBvZiBMaW5lYXIgTW9kZWwgRXN0aW1hdGVzIEJ5IFNjZW5hcmlvIFxuIE1lYW5ZZWFyIH4gU2NlbmFyaW8gXG4gRWFjaCBheGlzIHJlcHJlc2VudHMgYSBtb2RlbCBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBcbiBLID0gS3NlbGVjdGVkOyBSID0gUnNlbGVjdGVkOyBFID0gRXh0aXJwYXRlZDsgUyA9IFN1cnZpdmVkIikgKw0KICAgIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAtMTAsIHkgPSAyMCwgbGFiZWwgPSBwYXN0ZTAoIkFkai4gUjIgPSAiLCByb3VuZChzdW1tYXJ5KG1vZEJOKSRhZGouci5zcXVhcmVkLCAzKSkpDQopDQoNCiMgTGFtYmRhIGFuZCBJbmZvVHJhbg0KbW9kTFQ8LSBsbShlc3RpbWF0ZV9MYW1iZGEgfiBlc3RpbWF0ZV9JbmZvVHJhbiwgZGF0YSA9IGFsbFBhaXIpDQoNCmdncGxvdGx5KA0KICBhbGxQYWlyICU+JSANCiAgICBnZ3Bsb3QoYWVzKGVzdGltYXRlX0luZm9UcmFuLCBlc3RpbWF0ZV9MYW1iZGEsIGdyb3VwID0gVml0YWxSZXN1bHQsIGNvbG9yID0gVml0YWxSZXN1bHQpKSArDQogICAgZ2VvbV9wb2ludCgpICsNCiAgICBnZ3RpdGxlKCJQYWlyd2lzZSBDb250cmFzdCBvZiBMaW5lYXIgTW9kZWwgRXN0aW1hdGVzIEJ5IFNjZW5hcmlvIFxuIE1lYW5ZZWFyIH4gU2NlbmFyaW8gXG4gRWFjaCBheGlzIHJlcHJlc2VudHMgYSBtb2RlbCBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBcbiBLID0gS3NlbGVjdGVkOyBSID0gUnNlbGVjdGVkOyBFID0gRXh0aXJwYXRlZDsgUyA9IFN1cnZpdmVkIikgKw0KICAgIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAtMTAsIHkgPSAyMCwgbGFiZWwgPSBwYXN0ZTAoIkFkai4gUjIgPSAiLCByb3VuZChzdW1tYXJ5KG1vZExUKSRhZGouci5zcXVhcmVkLCAzKSkpDQopDQoNCiMgTGFtYmRhIGFuZCBJbmZvRGVhdGgNCm1vZExEPC0gbG0oZXN0aW1hdGVfTGFtYmRhIH4gZXN0aW1hdGVfSW5mb0RlYXRoLCBkYXRhID0gYWxsUGFpcikNCg0KZ2dwbG90bHkoDQogIGFsbFBhaXIgJT4lIA0KICAgIGdncGxvdChhZXMoZXN0aW1hdGVfSW5mb0RlYXRoLCBlc3RpbWF0ZV9MYW1iZGEsIGdyb3VwID0gVml0YWxSZXN1bHQsIGNvbG9yID0gVml0YWxSZXN1bHQpKSArDQogICAgZ2VvbV9wb2ludCgpICsNCiAgICBnZ3RpdGxlKCJQYWlyd2lzZSBDb250cmFzdCBvZiBMaW5lYXIgTW9kZWwgRXN0aW1hdGVzIEJ5IFNjZW5hcmlvIFxuIE1lYW5ZZWFyIH4gU2NlbmFyaW8gXG4gRWFjaCBheGlzIHJlcHJlc2VudHMgYSBtb2RlbCBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBcbiBLID0gS3NlbGVjdGVkOyBSID0gUnNlbGVjdGVkOyBFID0gRXh0aXJwYXRlZDsgUyA9IFN1cnZpdmVkIikgKw0KICAgIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAtMTAsIHkgPSAyMCwgbGFiZWwgPSBwYXN0ZTAoIkFkai4gUjIgPSAiLCByb3VuZChzdW1tYXJ5KG1vZExEKSRhZGouci5zcXVhcmVkLCAzKSkpDQopDQoNCiMgTGFtYmRhIGFuZCBOYWl2ZQ0KbW9kTE48LSBsbShlc3RpbWF0ZV9MYW1iZGEgfiBlc3RpbWF0ZV9OYWl2ZSwgZGF0YSA9IGFsbFBhaXIpDQoNCmdncGxvdGx5KA0KICBhbGxQYWlyICU+JSANCiAgICBnZ3Bsb3QoYWVzKGVzdGltYXRlX05haXZlLCBlc3RpbWF0ZV9MYW1iZGEsIGdyb3VwID0gVml0YWxSZXN1bHQsIGNvbG9yID0gVml0YWxSZXN1bHQpKSArDQogICAgZ2VvbV9wb2ludCgpICsNCiAgICBnZ3RpdGxlKCJQYWlyd2lzZSBDb250cmFzdCBvZiBMaW5lYXIgTW9kZWwgRXN0aW1hdGVzIEJ5IFNjZW5hcmlvIFxuIE1lYW5ZZWFyIH4gU2NlbmFyaW8gXG4gRWFjaCBheGlzIHJlcHJlc2VudHMgYSBtb2RlbCBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBcbiBLID0gS3NlbGVjdGVkOyBSID0gUnNlbGVjdGVkOyBFID0gRXh0aXJwYXRlZDsgUyA9IFN1cnZpdmVkIikgKw0KICAgIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAtMTAsIHkgPSAyMCwgbGFiZWwgPSBwYXN0ZTAoIkFkai4gUjIgPSAiLCByb3VuZChzdW1tYXJ5KG1vZExOKSRhZGouci5zcXVhcmVkLCAzKSkpDQopDQoNCiMgSW5mb1RyYW4gYW5kIEluZm9EZWF0aA0KbW9kVEQ8LSBsbShlc3RpbWF0ZV9JbmZvVHJhbiB+IGVzdGltYXRlX0luZm9EZWF0aCwgZGF0YSA9IGFsbFBhaXIpDQoNCmdncGxvdGx5KA0KICBhbGxQYWlyICU+JSANCiAgICBnZ3Bsb3QoYWVzKGVzdGltYXRlX0luZm9EZWF0aCwgZXN0aW1hdGVfSW5mb1RyYW4sIGdyb3VwID0gVml0YWxSZXN1bHQsIGNvbG9yID0gVml0YWxSZXN1bHQpKSArDQogICAgZ2VvbV9wb2ludCgpICsNCiAgICBnZ3RpdGxlKCJQYWlyd2lzZSBDb250cmFzdCBvZiBMaW5lYXIgTW9kZWwgRXN0aW1hdGVzIEJ5IFNjZW5hcmlvIFxuIE1lYW5ZZWFyIH4gU2NlbmFyaW8gXG4gRWFjaCBheGlzIHJlcHJlc2VudHMgYSBtb2RlbCBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBcbiBLID0gS3NlbGVjdGVkOyBSID0gUnNlbGVjdGVkOyBFID0gRXh0aXJwYXRlZDsgUyA9IFN1cnZpdmVkIikgKw0KICAgIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAtMTAsIHkgPSAyMCwgbGFiZWwgPSBwYXN0ZTAoIkFkai4gUjIgPSAiLCByb3VuZChzdW1tYXJ5KG1vZFREKSRhZGouci5zcXVhcmVkLCAzKSkpDQopDQoNCiMgSW5mb1RyYW4gYW5kIE5haXZlDQptb2RUTjwtIGxtKGVzdGltYXRlX0luZm9UcmFuIH4gZXN0aW1hdGVfTmFpdmUsIGRhdGEgPSBhbGxQYWlyKQ0KDQpnZ3Bsb3RseSgNCiAgYWxsUGFpciAlPiUgDQogICAgZ2dwbG90KGFlcyhlc3RpbWF0ZV9OYWl2ZSwgZXN0aW1hdGVfSW5mb1RyYW4sIGdyb3VwID0gVml0YWxSZXN1bHQsIGNvbG9yID0gVml0YWxSZXN1bHQpKSArDQogICAgZ2VvbV9wb2ludCgpICsNCiAgICBnZ3RpdGxlKCJQYWlyd2lzZSBDb250cmFzdCBvZiBMaW5lYXIgTW9kZWwgRXN0aW1hdGVzIEJ5IFNjZW5hcmlvIFxuIE1lYW5ZZWFyIH4gU2NlbmFyaW8gXG4gRWFjaCBheGlzIHJlcHJlc2VudHMgYSBtb2RlbCBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBcbiBLID0gS3NlbGVjdGVkOyBSID0gUnNlbGVjdGVkOyBFID0gRXh0aXJwYXRlZDsgUyA9IFN1cnZpdmVkIikgKw0KICAgIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAtMTAsIHkgPSAyMCwgbGFiZWwgPSBwYXN0ZTAoIkFkai4gUjIgPSAiLCByb3VuZChzdW1tYXJ5KG1vZFROKSRhZGouci5zcXVhcmVkLCAzKSkpDQopDQoNCiMgSW5mb0RlYXRoIGFuZCBOYWl2ZQ0KbW9kRE48LSBsbShlc3RpbWF0ZV9JbmZvRGVhdGggfiBlc3RpbWF0ZV9OYWl2ZSwgZGF0YSA9IGFsbFBhaXIpDQoNCmdncGxvdGx5KA0KICBhbGxQYWlyICU+JSANCiAgICBnZ3Bsb3QoYWVzKGVzdGltYXRlX05haXZlLCBlc3RpbWF0ZV9JbmZvRGVhdGgsIGdyb3VwID0gVml0YWxSZXN1bHQsIGNvbG9yID0gVml0YWxSZXN1bHQpKSArDQogICAgZ2VvbV9wb2ludCgpICsNCiAgICBnZ3RpdGxlKCJQYWlyd2lzZSBDb250cmFzdCBvZiBMaW5lYXIgTW9kZWwgRXN0aW1hdGVzIEJ5IFNjZW5hcmlvIFxuIE1lYW5ZZWFyIH4gU2NlbmFyaW8gXG4gRWFjaCBheGlzIHJlcHJlc2VudHMgYSBtb2RlbCBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlciBcbiBLID0gS3NlbGVjdGVkOyBSID0gUnNlbGVjdGVkOyBFID0gRXh0aXJwYXRlZDsgUyA9IFN1cnZpdmVkIikgKw0KICAgIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAtMTAsIHkgPSAyMCwgbGFiZWwgPSBwYXN0ZTAoIkFkai4gUjIgPSAiLCByb3VuZChzdW1tYXJ5KG1vZEROKSRhZGouci5zcXVhcmVkLCAzKSkpDQopDQoNCg0KYGBgDQoNCiMjIyBIZXJlIGFyZSB0aGUgYWN0dWFsIHRhYmxlcyBvZiB0aGUgRWZmZWN0IFNpemVzIGZvciB0aGUgbGluZWFyIG1vZGVscw0KDQpUaGlzIHRhYmxlIHJlcHJlc2VudCB0aGUgRWZmZWN0IHNpemUgb2YgZWFjaCBTY2VuYXJpbyBvbiBNZWFuWWVhcnMgdG8gcmVhY2ggSyBvciBDcmFzaC4gSSBkaWQgbm90IGNhbGN1bGF0ZSBhbnkgZGlmZmVyZW5jZXMgYmV0d2VlbiBlZmZlY3Qgc2l6ZXMsIGJ1dCB5b3UgY291bGQgZG8gc28gaWYgeW91IGZlZWwgaXQgd291bGQgYmUgaW5mb3JtYXRpdmUuDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQphbGxFc3QNCg0KYGBgDQoNClRoaXMgdGFibGUgcmVwcmVzZW50IHRoZSBFZmZlY3Qgc2l6ZSBQYWlyd2lzZSBjb21wYXJpc29ucyBvZiBlYWNoIFNjZW5hcmlvIG9uIE1lYW5ZZWFycyB0byByZWFjaCBLIG9yIENyYXNoLiBUaGlzIGlzIHRoZSB0YWJsZSB1c2VkIGZvciB0aGUgYWJvdmUgU2NhdHRlcnBsb3RzLiAqKkZZSToqKiBGb3IgdGhpcyB0byB3b3JrLCBJIHJlbmFtZWQgdGhlIEJvbGQgY2F0ZWdvcmllcyB0byBiZSBMb3cgLSBIaWdoLCBzbyBJIHJlbW92ZWQgdGhlIHByZWZpeCAnc2tldycsIGFuZCBJIGFsc28gcmVuYW1lZCAndW5pZm9ybScgdG8gPSAnTWVkJy4gSnVzdCB0byBhbGxvdyBmb3IgZWFzaWVyIGRhdGEgam9pbmluZy4NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmFsbFBhaXINCg0KYGBg